#include "data_reflow/config_manager.h"
#include <fstream>

namespace data_reflow
{
    ConfigManager& ConfigManager::get_instance()
    {
        static ConfigManager instance;
        return instance;
    }

    bool ConfigManager::load_config(const std::string& config_path)
    {
        std::lock_guard<std::mutex> lock(config_mutex_);
        try
        {
            config_node_ = YAML::LoadFile(config_path);
        }
        catch (const YAML::BadFile& e)
        {
            RCLCPP_ERROR(rclcpp::get_logger("ConfigManager"), "配置文件不存在：%s，错误：%s",
                         config_path.c_str(), e.what());
            return false;
        }
        catch (const YAML::ParserException& e)
        {
            RCLCPP_ERROR(rclcpp::get_logger("ConfigManager"), "配置文件解析错误：%s，错误：%s",
                         config_path.c_str(), e.what());
            return false;
        }

        is_loaded_ = true;
        RCLCPP_INFO(rclcpp::get_logger("ConfigManager"), "配置文件加载成功: %s", config_path.c_str());
        return true;
    }

    int ConfigManager::get_int(const std::string& key, int default_val)
    {
        std::lock_guard<std::mutex> lock(config_mutex_);
        if (!is_loaded_ || !config_node_[key])
        {
            RCLCPP_WARN(rclcpp::get_logger("ConfigManager"), "未找到键：%s，使用默认值：%d",
                        key.c_str(), default_val);
            return default_val;
        }
        return config_node_[key].as<int>(default_val);
    }

    bool ConfigManager::get_bool(const std::string& key, bool default_val)
    {
        std::lock_guard<std::mutex> lock(config_mutex_);
        if (!is_loaded_ || !config_node_[key])
        {
            RCLCPP_WARN(rclcpp::get_logger("ConfigManager"), "未找到键：%s，使用默认值：%s",
                        key.c_str(), default_val ? "true" : "false");
            return default_val;
        }
        return config_node_[key].as<bool>(default_val);
    }

    double ConfigManager::get_double(const std::string& key, double default_val)
    {
        std::lock_guard<std::mutex> lock(config_mutex_);
        if (!is_loaded_ || !config_node_[key])
        {
            RCLCPP_WARN(rclcpp::get_logger("ConfigManager"), "未找到键：%s，使用默认值：%f",
                        key.c_str(), default_val);
            return default_val;
        }
        return config_node_[key].as<double>(default_val);
    }
}  // namespace data_reflow